package com.skh.linkedlist;

/**
 * @Author: skh
 * @Date: 2019/6/11 15:11
 * @Description: 876. 链表的中间结点
 */
public class MiddleNode {

    /*
    给定一个带有头结点 head 的非空单链表，返回链表的中间结点。

    如果有两个中间结点，则返回第二个中间结点。

    示例 1：

    输入：[1,2,3,4,5]
    输出：此列表中的结点 3 (序列化形式：[3,4,5])
    返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
    注意，我们返回了一个 ListNode 类型的对象 ans，这样：
    ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.

    示例 2：
    输入：[1,2,3,4,5,6]
    输出：此列表中的结点 4 (序列化形式：[4,5,6])
    由于该列表有两个中间结点，值分别为 3 和 4，我们返回第二个结点。
     */

    /*
    思路:可以采取建立两个指针，一个指针一次遍历两个节点，另一个节点一次遍历一个节点，当快指针遍历到空节点时，慢指针指向的位置为链表的中间位置，
    这种解决问题的方法称为快慢指针方法。

     */

    public ListNode middleNode(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;

        while (fast != null && fast.next != null) { //判断快指针是否到头.
            fast = fast.next.next;
            slow = slow.next;
        }

        return slow;
    }

    //使用数组保存链表
    public ListNode middleNode1(ListNode head) {
        ListNode[] a = new ListNode[1000];
        int t = 0;
        while (head != null) {
            a[t++] = head;
            head = head.next;
        }

        return a[t/2];
    }
}
